package UDPTools.Interface;

import Model.FileId;
import Model.PathFile;
import Model.Status;
import UDPTools.Exceptions.UDPSenderException;
import java.net.InetAddress;
import messages.Bye;
import messages.ChatMessage;
import messages.Composing;
import messages.FileRequest;
import messages.FileResponse;
import messages.Hello;
import messages.Presence;
import messages.Wizz;

/**
 * L'interface UDPSenderInterface définie les methodes qui gèrent l'envoi de 
 * signaux entre deux systèmes.
 * 
 * <p>Toutes les methodes définies dans l'interface UDPSenderInterface lèvent 
 * une exception de type  <tt>UDPSenderException</tt>
 *
 * @author      Frank Djomo
 * @author      Christelle SIAGO HAPPI
 * @author      djomopoueme@gmail.com
 * @author      christelle.siagohappi@gmail.com
 * @version     1.0
 * @see     UDPSenderException
 */
public interface UDPSenderInterface {

    /**
     * Gère l'envoi d'un signal Hello pour la notification de connexion.
     * Lors de la connexion d'un utilisateur, un signal <i>Hello Request</i> est diffusé en
     * broadcast sur le réseau pour notifier la connexion aux autres utilisateurs.
     * L'utilisateur attend un Hello Reply pour confirmer la notification.
     * @see Hello
     * @param login     Login de l'utilisateur local
     * @param request   Demande de réponse <code>true</code> 
     * @throws UDPSenderException 
     */
    public void sendHello(String login, boolean request) throws UDPSenderException;
     /**
    * Gère l'envoi d'un signal Hello pour confirmation une notification de connexion.
    * L'utilisateur qui reçoit un <i>Hello Request</i> repond en unicast avec signal
    * <i>Hello Reply</i>. 
    * @see Hello 
    * @param login      Login de l'utilisateur local
    * @param rAdress    Adresse IP de l'utilisateur distant destinataire du Hello Reply
    * @param reply      Demande de réponse <code>false</code>
    * @throws UDPSenderException 
    */
    public void sendHelloUnicast(String login,InetAddress rAdress, boolean reply) throws UDPSenderException;
     /**
    * Gère l'envoi d'un signal Bye pour la notification de deconnexion.
    * @see Bye 
    * @param login      Login de l'utilisateur local
    * @throws UDPSenderException 
    */
    public void sendBye(String login) throws UDPSenderException;
   /**
    * Gère l'envoi d'un signal Wizz à un utlisateur distant.
    * @see Wizz
    * @param login      Login de l'utilisateur local
    * @param rAdress    Adresse IP de l'utilisateur distant destinataire du Wizz
    * @throws UDPSenderException 
    */
    public void sendWizz(String login,InetAddress rAdress) throws UDPSenderException;
    /**
    * Gère l'envoi d'un signal ChatMessage à un utilisateur distant
    * @see ChatMessage
    * @param login          Login de l'utilisateur local
    * @param rAdress        Adresse IP de l'utilisateur distant destinataire du ChatMessage
    * @param messageText    Message texte à envoyer
    * @throws UDPSenderException 
    */
    public void sendChatMessage(String login,InetAddress rAdress,String messageText) throws UDPSenderException;
    /**
    * Gère l'envoi d'un signal FileRequest à un utilisateur distant
    * @see FileRequest
    * @param login          Login de l'utilisateur local
    * @param rAdress        Adresse IP de l'utilisateur distant
    * @param file           Nom du fichier à envoyer
    * @param fileId         Identifiant du fichier à envoyer
    * @param size           taille du fichier à envoyer
    * @throws UDPSenderException 
    */
    public void sendFileRequest(String login,InetAddress rAdress ,PathFile file , FileId fileId, long size)throws UDPSenderException;
    /**
    * Gère l'envoi d'un signal FileResponse à un utilisateur distant
    * @see FileResponse
    * @see FileId
    * 
    * @param login          Login de l'utilisateur local
    * @param rAdress        Adresse IP de l'utilisateur distant 
    * @param jAccept        Reponse à la demande de transfert
    *                      <code>true</code> si utilisateur accepte de recevoir un fichier
    *                      <code>false</code> sinon
    * @param request        FileRequest asscoié à l'utilisateur distant
    * @throws UDPSenderException 
    */
    public void sendFileResponse(String login,InetAddress rAdress ,boolean jAccept , FileRequest request) throws UDPSenderException;
   /**
    * Gère l'envoi d'un fichier à un utilisateur distant
    * @see PathFile
    * @param addressServer        Adresse IP du serveur TCP de transfert
    * @param portServer           port de connexion au serveur
    * @param pFileToSend          Nom du fichier à envoyer  
    * @throws UDPSenderException    
    */
    public void sendFileData(InetAddress addressServer ,int portServer,PathFile pFileToSend) throws UDPSenderException;
    /**
    * Gère l'envoi d'un signal Presence pour la notification de status
    * @see Presence
    * @param login          Login de l'utilisateur local
    * @param show           Status de l'utilisateur
    * @throws UDPSenderException    
    */
    public void sendPresence(String login, Status show ) throws UDPSenderException; 
     /**
    * Gère l'envoi d'un signal Composing pour la notification d'ecriture 
    * @see Composing
    * @param login          Login de l'utilisateur local
    * @param rAdress        Adresse IP de l'utilisateur distant
    * @param isWriting   <code>true</code> si utilisateur ecrit 
    *                  <code>false</code> sinon
    */
    public void sendComposing(String login, InetAddress rAdress,boolean isWriting ) throws UDPSenderException;
}
